package cn.zjyj.module.zjyj.dal.config;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * JSON 对象类型处理器，用于 MyBatis 中 JSON 对象与数据库字段的转换
 */
public class JsonObjectTypeHandler extends BaseTypeHandler<JSONObject> {

    /**
     * 设置非空参数到 PreparedStatement
     * @param ps PreparedStatement 对象
     * @param i 参数索引
     * @param parameter JSON 对象参数
     * @param jdbcType JDBC 类型
     * @throws SQLException SQL 异常
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, parameter.toJSONString());
    }

    /**
     * 根据列名从 ResultSet 中获取可空的 JSON 对象结果
     * @param rs ResultSet 对象
     * @param columnName 列名
     * @return JSON 对象
     * @throws SQLException SQL 异常
     */
    @Override
    public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String result = rs.getString(columnName);
        return JSON.parseObject(result);
    }

    /**
     * 根据列索引从 ResultSet 中获取可空的 JSON 对象结果
     * @param rs ResultSet 对象
     * @param columnIndex 列索引
     * @return JSON 对象
     * @throws SQLException SQL 异常
     */
    @Override
    public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String result = rs.getString(columnIndex);
        return JSON.parseObject(result);
    }

    /**
     * 根据列索引从 CallableStatement 中获取可空的 JSON 对象结果
     * @param cs CallableStatement 对象
     * @param columnIndex 列索引
     * @return JSON 对象
     * @throws SQLException SQL 异常
     */
    @Override
    public JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String result = cs.getString(columnIndex);
        return JSON.parseObject(result);
    }
}